﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using System.IO;
using produccion.vistamodelo;
using System.ComponentModel;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FRMConsultadeReferencias.xaml
    /// </summary>
    public partial class FRMConsultadeReferencias : Window
    {
        conrefp _conrefp;

        MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Para traer las funciones
        String StrConsulta;//FJRF - Para hacer consultas generales
        DataTable DtConsulta = new DataTable();//FJRF - Obtener el resultado de las consultas

        public FRMConsultadeReferencias()
        {
            InitializeComponent();
            _conrefp = (conrefp)this.DataContext;
        }
   
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            CboCodigoLinea.Style = null;//FJRF - Le quitamos el estilo para poder controlar el foco
            CboNombreLinea.Style = null;//FJRF - Le quitamos el estilo para poder controlar el foco

            StrConsulta = "SELECT UPPER(CODLIN_LNP) AS CODIGO,  UPPER(NOMLIN_LNP) AS NOMBRE FROM MAELINP ORDER BY NOMLIN_LNP";//FJRF - Hacemos la consulta

            CargarCombo(CboCodigoLinea, StrConsulta, "CODIGO", "CODIGO", "Codigo");//FJRF - Cargamos el codigo
            CargarCombo(CboNombreLinea, StrConsulta, "CODIGO", "NOMBRE", "Nombre");//FJRF - Cargamos el nombre

            Keyboard.Focus(texCod);
            limpiar();
        }
        #region FJRF - CargarCombosDejandoUnEspacioEnBlanco
        DataSet DsConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        private Boolean CargarCombo(ComboBox CboComboACargar, string strConsultaOracle, string strSelectedValuePath, string strDisplayMemberPath, string strCodigoNombre)
        {
            Boolean BooSiHayDatos = false;//FJRF - Variable para informar si hay datos o no
            CboComboACargar.ItemsSource = null;
            CboComboACargar.Items.Clear();//FJRF - Borramos los posibles datos que pueda tener el combo

            DtConsulta = new DataTable();//FJRF - Inicializamos la variable
            DsConsulta = new DataSet();//FJRF - Inicializamos la variable

            DtConsulta = MdoGeneral.consulta(strConsultaOracle);//FJRF - Realizamos la consulta y retornamos los datos

            if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos llenar el combo
            {
                BooSiHayDatos = true;//FJRF - Informamos que hay datos

                DataRow drEncabezado;
                drEncabezado = DtConsulta.NewRow();

                if (strCodigoNombre == "Codigo")
                {
                    drEncabezado[strSelectedValuePath] = "ZZZ999";
                    drEncabezado[strDisplayMemberPath] = "Seleccione";
                }
                if (strCodigoNombre == "Nombre")
                {
                    drEncabezado[strSelectedValuePath] = "ZZZ999";
                    drEncabezado[strDisplayMemberPath] = "una línea";
                }

                DtConsulta.Rows.Add(drEncabezado);

                DsConsulta.Tables.Add(DtConsulta);//FJRF - Adicionameos el datatable al dataset
                CboComboACargar.ItemsSource = DsConsulta.Tables[0].DefaultView;//FJRF - Cargamos los datos encontrados
                CboComboACargar.SelectedValuePath = strSelectedValuePath.ToUpper();//FJRF - Cargamos la posicion
                CboComboACargar.DisplayMemberPath = strDisplayMemberPath.ToUpper();//FJRF - Decimos cual dato se mostrara

                CboComboACargar.SelectedValue = "ZZZ999";//FJRF - Ponemos el combo en la primera posicion
            }
            return BooSiHayDatos;//FJRF - Avisamos que si hay o no hay datos
        }
        #endregion
        private void limpiar() 
        {
            texCod.Text = "";
            texMat.Text="";
            texFor.Text="";
            texSue.Text="";
            comLpre.SelectedValue="";
            comLcor.SelectedValue="";
            comLgua.SelectedValue="";
            comLmon.SelectedValue = "";
            _conrefp.txtRefp.CAMBIO = false;
        }

        string camb;
        private void texCod_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (_conrefp.CODREF_REF != camb)
            {
                if (_conrefp.txtRefp.CAMBIO)
                {
                    if (MessageBox.Show("¿Está seguro que desea cambiar de elemento? se perderán los cambios no guardados.", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel)//RRR
                    {
                        _conrefp.CODREF_REF = camb;
       
                        return;
                    }
                    _conrefp.txtRefp.CAMBIO = false;
                }
                camb = _conrefp.CODREF_REF;
                _conrefp.consultar();
                llenarTallaje();
                _conrefp.visorFotoReferencia.strCodigo = texCod.Text;

                if (!_conrefp.txtRef.EXISTE)
                {
                    texMat.Text = "";
                    texFor.Text = "";
                    texSue.Text = "";
                    comLpre.SelectedValue = "";
                    comLcor.SelectedValue = "";
                    comLgua.SelectedValue = "";
                    comLmon.SelectedValue = "";
                    _conrefp.txtRefp.CAMBIO = false;

                    LblCodigoProveedor.Content = "";
                    LblNombreProveedor.Content = "";

                    DtgPedidos.ItemsSource = null;
                    DtConsulta = null;
                    DtgPedidos.Items.Clear();
                }
                else
                {
                    LblCodigoProveedor.Content = MdoGeneral.StrRetornarUnSoloCampo("codprv_ref", "CodigoProveedor", "MAEREF", "CODREF_REF = '" + texCod.Text + "'");
                    LblNombreProveedor.Content = MdoGeneral.StrRetornarUnSoloCampo("NOMPRV_PRV", "NombreProveedor", "USU_DBA.MAEPRV", "CODPRV_PRV = '" + LblCodigoProveedor.Content.ToString() + "'"); ;

                    StrConsulta = "SELECT ";
                    StrConsulta = StrConsulta + "CODCLI_DPC AS CODCLI, NOMCLI_CLI AS CLIENTE, ";
                    StrConsulta = StrConsulta + "NROPED_DPC AS PEDIDOS, ";
                    StrConsulta = StrConsulta + "CODREF_DPC AS CODREF, NOMREF_REF AS REFERENCIA, ";
                    StrConsulta = StrConsulta + "CODCOL_DPC AS CODCOL, NOMCOL_COL AS COLOR, ";
                    StrConsulta = StrConsulta + "SUM(CANPED_DPC) AS PEDIDO, SUM(CANPED_DPC - CANDES_DPC - CANENT_DPC) AS PENDIENTE ";
                    StrConsulta = StrConsulta + "FROM ";
                    StrConsulta = StrConsulta + "DETPPCP, MAECLIP, USU_DBA.MAECOL, MAEREF ";
                    StrConsulta = StrConsulta + "WHERE ";
                    StrConsulta = StrConsulta + "CODREF_DPC = '" + texCod.Text + "' AND ";
                    StrConsulta = StrConsulta + "CODREF_DPC = CODREF_REF AND ";
                    StrConsulta = StrConsulta + "CODCLI_CLI = CODCLI_DPC AND ";
                    StrConsulta = StrConsulta + "CODCOL_COL = CODCOL_DPC AND ";
                    StrConsulta = StrConsulta + "CODCLI_DPC IN (SELECT CODCLI_CLI FROM MAECLIP WHERE CLICOM_CLI = 'S') ";
                    StrConsulta = StrConsulta + "GROUP BY ";
                    StrConsulta = StrConsulta + "CODCLI_DPC, NOMCLI_CLI, NOMCOL_COL, NROPED_DPC, CODREF_DPC, CODCOL_DPC, NOMREF_REF ";
                    StrConsulta = StrConsulta + "HAVING ";
                    StrConsulta = StrConsulta + "SUM(CANPED_DPC - CANDES_DPC - CANENT_DPC)  > 0 ";
                    StrConsulta = StrConsulta + "ORDER BY CODCLI_DPC, NROPED_DPC ";

                    DtConsulta = MdoGeneral.consulta(StrConsulta);
                    DtgPedidos.ItemsSource = DtConsulta.DefaultView;
                }
                CboCodigoLinea.SelectedValue = _conrefp.txtRefp.CODLIN_REF;
            }
        }
        private void DtgPedidos_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (strNombreColumna == "PEDIDO" || strNombreColumna == "PENDIENTE")
            {
                Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";//FJRF - Enviamos el formato a la celda
                (e.Column as DataGridTextColumn).CellStyle = MyStyleTextAlignmentProperty;//FJRF - Asignamos el estilo creado
            }
            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella
        } 

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (_conrefp.txtRefp.CAMBIO)
            {
                if (MessageBox.Show("¿Está seguro que desea salir? se perderán los cambios no guardados.", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel)
                {
                    e.Cancel = true;
                }
                else
                {
                    _conrefp.txtRefp.CAMBIO = false;
                }
            }
       
        }
        
        private void butSal_Click(object sender, RoutedEventArgs e)
        {
              this.Close();
        }
        
        private void butGua_Click(object sender, RoutedEventArgs e)
        {
           _conrefp.guardar(wPnot);
           texCod.Focus();
           texCod.Select(0,0);
        }

        private void llenarTallaje()
        {
            DataTable talla = new DataTable();
            foreach (DataRow r in _conrefp.dtTalla.Rows)
            {
                talla.Columns.Add(r[0].ToString());
            }
            DataRow n = talla.NewRow();
            int e = 0;
            foreach (DataRow r in _conrefp.dtTalla.Rows)
            {
                n[e] = r[1];
                e++;
            }
            talla.Rows.Add(n);
            datTall.ItemsSource = talla.DefaultView;
            e = 0;
            foreach (DataRow r in _conrefp.dtTalla.Rows)
            {
                if (r[2].ToString() != "")
                {
                    Style s = (Style)this.FindResource("estilo");
                    datTall.Columns[e].CellStyle = (Style)FindResource("estilo");
                }
                e++;
            }
            datTall.CanUserAddRows = false;
        }

        
        private void datColo_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (datColo.SelectedIndex != -1)
            {
                _conrefp.visorFotoReferencia.strCodigo = texCod.Text;
                _conrefp.visorFotoReferencia.strColor = _conrefp.dtColor.Rows[datColo.SelectedIndex][0].ToString();
            }
        }

        private void datCole_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
        {
            _conrefp.txtRefp.CAMBIO = true;
        }

        private void buscRef(object sender, RoutedEventArgs e)
        {
            FRMBuscarCol f = new FRMBuscarCol();
                       
            f.EsReferencia = true;
            f.RequiereColor = false;
            f.Retorno = "";
            f.ShowDialog();

            if (!f.Retorno.Equals(""))
            {
                texCod.Text = f.Retorno;
                return;
            }
            if (texCod.Text == f.Retorno)
            {
                texCod_TextChanged(null, null);
            }
        }

        private void datCole_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                e.Handled = true;
                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        private void datTall_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                e.Handled = true;
                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        //
        // SINGLE CLICK EDITING
        //
        private void DataGridCell_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            DataGridCell cell = sender as DataGridCell;
            if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
            {
                if (!cell.IsFocused)
                {
                    cell.Focus();
                }
                DataGrid dataGrid = FindVisualParent<DataGrid>(cell);
                if (dataGrid != null)
                {
                    if (dataGrid.SelectionUnit != DataGridSelectionUnit.FullRow)
                    {
                        if (!cell.IsSelected)
                        {
                            cell.IsSelected = true;
                            cell.Focus();
                        }
                    }
                    else
                    {
                        DataGridRow row = FindVisualParent<DataGridRow>(cell);
                        if (row != null && !row.IsSelected)
                        {
                            row.IsSelected = true;
                            row.Focus();
                        }
                    }
                }
            }
        }

        static T FindVisualParent<T>(UIElement element) where T : UIElement
        {
            UIElement parent = element;
            while (parent != null)
            {
                T correctlyTyped = parent as T;
                if (correctlyTyped != null)
                {
                    return correctlyTyped;
                }
                parent = VisualTreeHelper.GetParent(parent) as UIElement;
            }
            return null;
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.F3 && elemento != null)
            {
                if (e.Key == Key.F3)
                {
                    if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
                }
            }

            if (e.Key == Key.F4 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
            }
        }

        private void CboCodigoLinea_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (this.IsLoaded == true)
            {
                CboNombreLinea.SelectedIndex = CboCodigoLinea.SelectedIndex;//FJRF - igualamos la posicion del codigo seleccionado a la posicion del nombre
            }
        }
        private void CboNombreLinea_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (this.IsLoaded == true)
            {
                CboCodigoLinea.SelectedIndex = CboNombreLinea.SelectedIndex;//FJRF - igualamos la posicion del nombre seleccionado a la posicion del codigo
            }
        } 

    }


    internal class conrefp : ObservableObject
    {
        #region propiedades

        //----------------------------------------------
        private string _strTituloVentana;
        public string strTituloVentana
        {
            get { return _strTituloVentana; }
            set { _strTituloVentana = value; RaisePropertyChangedEvent("strTituloVentana"); }
        }

        private VMbuscarReferencia _buscarReferencia;
        public VMbuscarReferencia buscarReferencia
        {
            get { return _buscarReferencia; }
            set { _buscarReferencia = value; RaisePropertyChangedEvent("buscarReferencia"); }
        }

        //Propiedad enlazada a los campos de la referencia
        private clases.CLSMAEREFP _txtRefp = new clases.CLSMAEREFP();
        public clases.CLSMAEREFP txtRefp
        {
            get { return _txtRefp; }
            set { _txtRefp = value; RaisePropertyChangedEvent("txtRefp"); }
        }

        //Propiedad enlazada el nombre de una referencia
        private clases.CLSMAEREF _txtRef = new clases.CLSMAEREF();
        public clases.CLSMAEREF txtRef
        {
            get { return _txtRef; }
            set { _txtRef = value; RaisePropertyChangedEvent("txtRef"); }
        }

        //Mascara para codigo de referencia (Diponible en dods objetos)
        public string CODREF_REF
        {
            get { return txtRef.CODREF_REF; }
            set
            {
                txtRef.CODREF_REF = value;
                txtRefp.CODREF_REF = txtRef.CODREF_REF;
                RaisePropertyChangedEvent("CODREF_REF");
            }
        }

        //Propiedad enlazada a los colores
        private DataTable _dtColor = new DataTable();
        public DataTable dtColor
        {
            get { return _dtColor; }
            set { _dtColor = value; RaisePropertyChangedEvent("dtColor"); }
        }

        //Propiedad enlazada a las tallas
        private DataTable _dtTalla = new DataTable();
        public DataTable dtTalla
        {
            get { return _dtTalla; }
            set { _dtTalla = value; RaisePropertyChangedEvent("dtTalla"); }
        }

        private VMvisorFotoReferencia _visorFotoReferencia = new VMvisorFotoReferencia();
        public VMvisorFotoReferencia visorFotoReferencia
        {
            get { return _visorFotoReferencia; }
            set { _visorFotoReferencia = value; RaisePropertyChangedEvent("visorFotoReferencia"); }
        }

        //Propiedad enlazada a las Coleccion
        private DataTable _dtCole = new DataTable();
        public DataTable dtCole
        {
            get { return _dtCole; }
            set { _dtCole = value; RaisePropertyChangedEvent("dtCole"); }
        }

        private List<clases.CLSCONTROLP> _linPre = new clases.CLSCONTROLP { ID_CON = "LPR" }.consPorID();
        public List<clases.CLSCONTROLP> linPre
        {
            get { return _linPre; }
            set { _linPre = value; RaisePropertyChangedEvent("linPre"); }
        }

        private List<clases.CLSCONTROLP> _linCor = new clases.CLSCONTROLP { ID_CON = "LCO" }.consPorID();
        public List<clases.CLSCONTROLP> linCor
        {
            get { return _linCor; }
            set { _linCor = value; RaisePropertyChangedEvent("linCor"); }
        }

        private List<clases.CLSCONTROLP> _linGua = new clases.CLSCONTROLP { ID_CON = "LGU" }.consPorID();
        public List<clases.CLSCONTROLP> linGua
        {
            get { return _linGua; }
            set { _linGua = value; RaisePropertyChangedEvent("linGua"); }
        }

        private List<clases.CLSCONTROLP> _linMon = new clases.CLSCONTROLP { ID_CON = "LMO" }.consPorID();
        public List<clases.CLSCONTROLP> linMon
        {
            get { return _linMon; }
            set { _linMon = value; RaisePropertyChangedEvent("linMon"); }
        }

        #endregion

        //Clase consulta de colores para una referencia
        private clases.CLSMAEPRO MAEPRO = new clases.CLSMAEPRO();
        //Clase consulta de colecciones
        private clases.CLSREFCLCP REFCLCP = new clases.CLSREFCLCP();

        #region metodos

        //-----------------------------------------------------------------------------
        public conrefp()
        {
            buscarReferencia = new VMbuscarReferencia();
            buscarReferencia.TieneColor = false;
            buscarReferencia.PropertyChanged += onBuscarReferenciaPropertyChanged;

            MDOgeneral.conectar();
            strTituloVentana = "Consulta de Referencias - Usuario: " + MDOgeneral.usuario + " - [FRMConsultadeReferencias]";
        }

        void onBuscarReferenciaPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            try
            {
                if (e.PropertyName == "IsOpen")
                {
                    if (!buscarReferencia.IsOpen)
                    {
                        foreach (string x in buscarReferencia.listaProducto)
                        {
                            CODREF_REF = x;
                        }
                    }
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        RelayCommand _cmdBuscarReferencia;
        public ICommand cmdBuscarReferencia
        {
            get
            {
                if (_cmdBuscarReferencia == null)
                {
                    _cmdBuscarReferencia = new RelayCommand(r => buscar_referencia());
                }
                return _cmdBuscarReferencia;
            }
        }

        private void buscar_referencia()
        {
            try
            {
                buscarReferencia.IsOpen = true;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public void consultar()
        {
            txtRef.Consultar();
            if (txtRef.EXISTE)
            {
                txtRefp.CODREF_REF = txtRef.CODREF_REF;
                txtRefp.consultar();
                MAEPRO.CODREF_PRO = txtRef.CODREF_REF;
                this.dtColor = MAEPRO.BuscarColor();
                this.dtTalla = MAEPRO.ConsTallaje();
                REFCLCP.CODREF_RXC = txtRef.CODREF_REF;
                llenarColeccion(REFCLCP.ColeccionesPorRef());
            }
            else
            {
                dtColor.Rows.Clear();
                dtTalla.Rows.Clear();
                dtCole.Rows.Clear();
            }
        }

        private void llenarColeccion(DataTable val)
        {
            dtCole = new DataTable();
            dtCole.Columns.Add("Codigo");
            dtCole.Columns.Add("Coleccion");
            dtCole.Columns.Add("Existe");
            dtCole.Columns["Existe"].DataType = System.Type.GetType("System.Boolean");
            DataRow u = dtCole.NewRow();
            foreach (DataRow r in val.Rows)
            {
                if (!String.IsNullOrEmpty(r[2].ToString()))
                {
                    u[0] = r[0];
                    u[1] = r[1];
                    u[2] = true;
                    dtCole.Rows.Add(u);
                    u = dtCole.NewRow();
                }
            }
            dtCole.AcceptChanges();
        }

        public void guardar(WrapPanel wPnot)
        {
            try
            {
                txtRefp.CODREF_REF = txtRef.CODREF_REF;
                if (txtRefp.EXISTE)
                {
                    if (txtRefp.ActualizarRefCole(dtCole, dtColor) > 0)
                    {
                        txtRefp.CAMBIO = false;
                        new MDOgeneral.notificar(wPnot, "Los cambios fueron guardados satisfactoriamente.", true);
                    }
                    else
                    {
                        new MDOgeneral.notificar(wPnot, "Los cambios no pueden ser guardados.", false);
                    }
                }
                else
                {
                    if (txtRefp.InsertarRefCole(dtCole, dtColor) > 0)
                    {
                        txtRefp.CAMBIO = false;
                        txtRefp.EXISTE = true;
                        new MDOgeneral.notificar(wPnot, "El elemento fue creado satisfactoriamente.", true);
                    }
                    else
                    {
                        new MDOgeneral.notificar(wPnot, "El elemento no puede ser creado.", false);
                    }
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        #endregion
    }


}
